package br.com.cinesystem.persistence;

import br.com.cinesystem.entity.Cinema;
import br.com.cinesystem.entity.Filme;
import br.com.cinesystem.entity.Ingresso;
import br.com.cinesystem.entity.Sala;
import br.com.cinesystem.entity.Sessao;
import br.com.cinesystem.entity.Venda;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class IngressoDao extends Dao {

    public IngressoDao() {
    }

   public void salvar(Ingresso i)throws Exception{

       abrirConexao();

       stmt = con.prepareStatement("INSERT INTO ingresso VALUES (NULL,?,?,?,?)");
       stmt.setInt(1, i.getSessao().getIdSessao());
       stmt.setInt(2, i.getVenda().getIdVenda());
       stmt.setString(3, i.getTipo());
       stmt.setDouble(4, i.getValor());

       stmt.execute();

       fecharConexao();

   }

   public List<Ingresso> buscarPorSessao(Sessao s)throws Exception{

       abrirConexao();

       StringBuilder sb = new StringBuilder();

       sb.append("SELECT i.id_Sessao, i.idIngresso, i.tipo, i.valor, ");
       sb.append("v.idVenda, v.situacao FROM ingresso i INNER JOIN venda v ");
       sb.append("ON v.idVenda = i.id_Venda WHERE i.id_Sessao=? and v.situacao<>'CA' and v.situacao<>'CE'");

       stmt = con.prepareStatement(sb.toString());
       stmt.setInt(1, s.getIdSessao());

       rs = stmt.executeQuery();

       List<Ingresso> lista = new ArrayList<Ingresso>();
       

       while(rs.next()){
            Ingresso ingresso = new Ingresso();

            ingresso.setSessao(new Sessao());
            ingresso.setVenda(new Venda());

            ingresso.getSessao().setIdSessao(rs.getInt("id_Sessao"));
            ingresso.getVenda().setIdVenda(rs.getInt("idVenda"));

            ingresso.setTipo(rs.getString("tipo"));
            ingresso.setValor(rs.getDouble("valor"));
            ingresso.setIdIngresso(rs.getInt("idIngresso"));

            lista.add(ingresso);
       }
       fecharConexao();
       return lista;
   }

   public List<Ingresso> buscarPorVenda(Venda v)throws Exception{

       abrirConexao();
       
       StringBuilder sb = new StringBuilder();

       sb.append("SELECT i.id_Sessao, i.idIngresso, i.tipo, i.valor, ");
       sb.append("f.idFilme, f.titulo, c.idCinema, c.razaoSocial, se.preco, ");
       sb.append("se.detalhes, se.data, se.hora, sa.idSala, sa.nome, sa.capacidade, ");
       sb.append("v.idVenda, v.situacao FROM ingresso i INNER JOIN venda v ON v.idVenda = i.id_Venda ");
       sb.append("INNER JOIN sessao se ON i.id_Sessao = se.idSessao ");
       sb.append("INNER JOIN filme f ON se.id_Filme = f.idFilme ");
       sb.append("INNER JOIN sala sa ON se.id_Sala = sa.idSala ");
       sb.append("INNER JOIN cinema c ON sa.id_Cinema = c.idCinema ");
       sb.append("WHERE v.idVenda=? and v.situacao='CA'");

       stmt = con.prepareStatement(sb.toString());
       stmt.setInt(1, v.getIdVenda());

       rs = stmt.executeQuery();

       List<Ingresso> lista = new ArrayList<Ingresso>();
       
       while(rs.next()){
            Ingresso ingresso = new Ingresso();

            ingresso.setSessao(new Sessao());
            ingresso.setVenda(new Venda());
            ingresso.getSessao().setFilme(new Filme());
            ingresso.getSessao().setSala(new Sala());
            ingresso.getSessao().getSala().setCinema(new Cinema());

            SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy");
            SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm:ss");

            ingresso.getSessao().setIdSessao(rs.getInt("id_Sessao"));
            ingresso.getSessao().setData((Date) sdf1.parse(sdf1.format(rs.getDate("data"))));
            ingresso.getSessao().setHora((Date) sdf2.parse(sdf2.format(rs.getTime("hora"))));
            ingresso.getSessao().setPreco(rs.getDouble("preco"));
            ingresso.getSessao().setDetalhes(rs.getString("detalhes"));

            ingresso.getSessao().getFilme().setIdFilme(rs.getInt("idFilme"));
            ingresso.getSessao().getFilme().setTitulo(rs.getString("titulo"));

            ingresso.getSessao().getSala().setIdSala(rs.getInt("idSala"));
            ingresso.getSessao().getSala().setNome(rs.getString("nome"));
            ingresso.getSessao().getSala().setCapacidade(rs.getInt("capacidade"));

            ingresso.getSessao().getSala().getCinema().setIdCinema(rs.getInt("idCinema"));
            ingresso.getSessao().getSala().getCinema().setRazaoSocial(rs.getString("razaoSocial"));

            ingresso.getVenda().setIdVenda(rs.getInt("idVenda"));

            ingresso.setTipo(rs.getString("tipo"));
            ingresso.setValor(rs.getDouble("valor"));
            ingresso.setIdIngresso(rs.getInt("idIngresso"));

            lista.add(ingresso);
       }
       fecharConexao();
       return lista;
   }

   public void excluir(Ingresso i)throws Exception{

       abrirConexao();

       stmt = con.prepareStatement("DELETE FROM ingresso WHERE idIngresso=?");
       stmt.setInt(1, i.getIdIngresso());

       stmt.execute();

       fecharConexao();

   }

}
